/*************模块二：ES 新特性与  Typescript、JS 性能优化***********/

//简单题

//1.请说出下列最终的执行结果，并解释为什么。
// var a = [];
// for (var i = 0; i < 10; i++) {
//   a[i] = function () {
//     console.log(i);
//   }
// }
// a[6]();
/*答:输出10，因为var是没有块作用域的，var声明的变量会在全局作用域上，
等到a[6]这个函数执行的时候，循环已经结束了，而此时全局作用域上i的是10，所以就打印的是10
*/


//2.请说出下列最终的执行结果，并解释为什么。
// var tmp = 123;
// if (true) {
//   console.log(tmp);
//   let tmp;
// }

/*答:报错，因为if是有一个块级作用域的，
在这里面执行的代码，会先在这个作用域查找，这个时候就找到了一个同级的一个tmp，
但是let声明的变量没有提升，必须要先声明才能使用
*/



// 三、结合 ES6 新语法，用最简单的方式找出数组中的最小值。
// var arr = [12, 34, 32, 89, 4]
// let min = arr.reduce((prev, next) => {
//   return Math.min(prev, next)
// }, arr[0])
// console.log(min) //输出4


//四、请详细说明 var, let, const 三种声明变量的方式之间的具体差别。
/*答：
  var: 声明的变量存在提升，可以在声明前使用，没有自己的作用域，赋值后可以更改
  let: 变量必须先声明再使用，有自己的会计作用域，，赋值后可以更改
  const: 基本和let相似，但是首次赋值后值就确定了，无法更改。
*/

// 五、请说出下列代码最终输出的结果并解释为什么。
// var a = 10;
// var obj = {
//   a: 20,
//   fn() {
//     setTimeout(() => {
//       console.log(this.a);
//     })
//   }
// }
// obj.fn();

//输出20；
//箭头函数没有自己的this，它运行的时候的this, 是由它定义的时候，包裹它的第一个普通函数的this决定的。


// 六、简述 Symbol 类型的用途。
//答: 1.可以用来做唯一的key值。  2.可以用来定义对象的私有属性，让外部访问不到


// 七、说说什么是浅拷贝，什么是深拷贝
/*
  答：如果是基础类型，浅拷贝是拷贝的值，如果是对象类型，浅拷贝的是对象的引用，如果对象属性值发生了变化，则拷贝出来的对象也会受到影响
     而深拷贝，如果是基础类型，拷贝的是值，如果是对象类型，则是堆上复制了一个一模一样的对象，前后两个对象互不影响。
*/

// 八、请简述 Typescript 与 Javascript 之的关系。
/*
答：ts是js的超集，是在js的基础上拓展出来的一门语言，又或者说是带有类型约束的js。
 */

// 九、请谈谈你所认为的 Typescript 优缺点
/*
答：
优点：代码更健壮；可读性更高；ide自动提示功能提高开发效率；大型项目重构时候更方便；
缺点：小项目使用的话，会带来一些局限，降低一些开发效率
 */


// 十、描述引用计数的工作原理和优缺点
/*
答：系统内部存在一个引用计数器，当一个对象被引用的时候，则引用计数器加1，取消引用，则减1，当计数器为0的时候，对象销毁。
优点：资源回收效率高，当对象计数器为0的时候，立马回收
缺点：无法解决循环引用的问题
 */

// 十一、描述标记整理算法的工作流程。
/*
答：分为两步，标记和整理，第一步会先标记所有的可达对象；同时对内存空间进行整理，预防空间碎片化；第二部清除；将不可达的对象从内存清除
 */

// 十ニ、描述 V8 中新生代存储区垃圾回收的流程。
/*
答：V8采用分代回收的机制， 其将内存分为两类：新生代内存空间和老生代内存空间，
新生代内存空间主要用来存放存活时间较短的对象，老生代内存空间主要用来存放存活时间较长的对象.
新生代内存空间会一分为2，一个处于使用from，一个处于闲置to,
在垃圾回收运行时时，会检查 From 中的对象，当某个对象需要被回收时，将其留在 From 空间,剩下的对象移动到 To 空间,
然后进行反转，将From空间和To空间互换。进行垃圾回收时，会将 To 空间的内存进行释放,
简而言之，就是From空间中存放不需要被回收的对象，To 空间中存放需要被回收的对象，当垃圾回收运行时，将 To 空间中的对象全部进行回收
*/

// 十三、描述增量标记算法在何时使用及工作原理。
/*
答：在V8清除老生代对象时为提高清除效率优化时使用；
清除时，程序执行然后遍历对象进行标记，之后交替执行程序和增量标记操作，标记完成后，进行清除操作，完成垃圾回收；
*/
